﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using FarseerPhysics;
using FarseerPhysics.Dynamics;
using FarseerPhysics.Factories;
using FarseerPhysics.Collision;
using FarseerPhysics.Collision.Shapes;
using Somnus.Utils;
using Somnus.Core;
using FarseerPhysics.Dynamics.Contacts;

namespace Somnus.Objects.GameObjects.Characters
{
    class Indio : PlayableCharacter
    {
        /// <summary>
        /// Essa variável controla o status de possível transformação, quando o usuário apertou apenas uma vez o direcional 
        /// </summary>
        private bool possibleTransformation;

        /// <summary>
        /// A quantidade de tempo necessário pro jogador apertar o botão novamente para a transformação
        /// </summary>
        private int timeToTransform;

        /// <summary>
        /// Timer que vai de 0 até o timeToTransform
        /// Usado para o controle da transformação.
        /// </summary>
        private int transformationTimer;

        /// <summary>
        /// Direção da transformação, para evitar que o jogador vire lobo ao alternar as teclas
        /// </summary>
        private Keys transformationDirection;


        public Indio(DreamWorld world, String name, Texture2D texture, Nullable<Rectangle> sourceRectangle, BodyType bodyType, float x, float y, float width, float height)
            : base(world, name, texture, sourceRectangle, bodyType, x, y, width, height)
        {
            #region Animações


            AnimatedObject.AnimationStructure andando = new AnimatedObject.AnimationStructure();
            andando.name = "Correndo";
            andando.frameCount = 13;
            andando.X = 0;
            andando.Y = 0;
            andando.framesPerSecond = 30;
            if (sourceRectangle != null)
            {
                Rectangle rectangle = (Rectangle)sourceRectangle;
                andando.frameWidth = rectangle.Width;
                andando.frameHeight = rectangle.Height;
            }
            else
            {
                andando.frameWidth = texture.Width;
                andando.frameHeight = texture.Height;
            }
            art.addAnimation(andando);

       

            #endregion

            possibleTransformation = false;
            timeToTransform = 15;
            transformationTimer = 0;
        }

        protected override void CreateBody(World world)
        {
            body = new Body(world);
            body.BodyType = BodyType.Dynamic;
        }

        protected override void verifyTransformedMovement(ref Vector2 velocity)
        {
            if (Controller.KeyDown(Keys.Left))
            {
                velocity.X -= transformedAceleration;
                this.art.inverted = true;
            }
            else if (Controller.KeyDown(Keys.Right))
            {
                velocity.X += transformedAceleration;
                this.art.inverted = false;
            }

            if (Controller.KeyPressed(Keys.Up) && onGround)
            {
                velocity.Y = -transformedJumpVelocity;
            }
            else if (Controller.KeyDown(Keys.Up) && !onGround && velocity.Y < 0)
            {
                velocity.Y -= transformedJumpAceleration;
            }
        }

        protected override void verifyTransformation()
        {
            // Caso o jogador aperte uma direção, é registrado que é possível que ele se transforme para essa posição.

            if (Controller.KeyPressed(Keys.Right))
            {
                possibleTransformation = true;
                transformationDirection = Keys.Right;
            }
            else if (Controller.KeyPressed(Keys.Left))
            {
                possibleTransformation = true;
                transformationDirection = Keys.Left;
            }
        }

        protected override void verifyUntransformation()
        {


            if(Controller.KeyReleased(Keys.Right))
            {
                if (!Controller.KeyDown(Keys.Left))
                {
                    transformed = false;
                    Console.WriteLine("UNTRANSFORM");
                }
            }

            if (Controller.KeyReleased(Keys.Left))
            {
                if (!Controller.KeyDown(Keys.Right))
                {
                    transformed = false;
                    Console.WriteLine("UNTRANSFORM");
                }
            }
        }

        protected override void additionalHumanCommands()
        {
            verifyTransformationFinalle();
        }

        private void verifyTransformationFinalle()
        {
            if (possibleTransformation)
            {
                if (Controller.KeyPressed(Keys.Right) && transformationDirection == Keys.Right && transformationTimer > 0)
                {
                    transformed = true;
                    transformationTimer = 0;
                    possibleTransformation = false;
                }
                else if (Controller.KeyPressed(Keys.Left) && transformationDirection == Keys.Left && transformationTimer > 0)
                {
                    transformed = true;
                    transformationTimer = 0;
                    possibleTransformation = false;
                }
                else
                {
                    transformationTimer++;
                    if (transformationTimer >= timeToTransform)
                    {
                        transformationTimer = 0;
                        possibleTransformation = false;
                    }
                }
            }
        }

        
        protected override void additionalTransformedCommands()
        {

        }
    }
}
